#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>

// 使用 long long 防止整数溢出
using ll = long long;

// OI/ACM 风格的快速输入函数
inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

// 全局变量以避免在多组测试数据中重复分配内存
// a: 存储初始塔高
std::vector<int> a;
// costs: 存储每个塔到某个目标高度的最小代价
std::vector<ll> costs;

// 主解决函数
void solve() {
    int n = read();
    int m = read();

    // 如果需要保留的塔数量为0，则不需要任何操作
    if (n - m == 0) {
        printf("0\n");
        // 读取并丢弃本组数据的塔高
        for (int i = 0; i < n; ++i) {
            read();
        }
        return;
    }

    a.resize(n);
    std::set<int> candidate_heights; // 使用 set 自动去重和排序

    // 1. 预处理：生成所有可能的候选目标高度
    for (int i = 0; i < n; ++i) {
        a[i] = read();
        int current_h = a[i];
        while (true) {
            candidate_heights.insert(current_h);
            if (current_h == 0) break;
            current_h /= 2;
        }
    }

    ll min_total_cost = -1; // 初始化为-1，表示无穷大

    costs.resize(n);

    // 2. 枚举所有候选目标高度
    for (int target_h : candidate_heights) {
        // 对于当前的 target_h，计算每个塔转换到此高度的最小代价
        for (int i = 0; i < n; ++i) {
            int current_a = a[i];
            int divisions = 0;
            ll min_cost_for_one_tower = -1;

            // 计算 cost(a[i], target_h)
            // 通过枚举除法次数来找到最优路径
            while (true) {
                ll current_cost = divisions + std::abs((ll)current_a - target_h);
                if (min_cost_for_one_tower == -1 || current_cost < min_cost_for_one_tower) {
                    min_cost_for_one_tower = current_cost;
                }
                if (current_a == 0) break;
                current_a /= 2;
                divisions++;
            }
            costs[i] = min_cost_for_one_tower;
        }

        // 排序所有代价，选取最小的 n-m 个
        std::sort(costs.begin(), costs.end());

        // 计算当前目标高度下的总代价
        ll current_total_cost = 0;
        for (int i = 0; i < n - m; ++i) {
            current_total_cost += costs[i];
        }

        // 更新全局最小总代价
        if (min_total_cost == -1 || current_total_cost < min_total_cost) {
            min_total_cost = current_total_cost;
        }
    }

    // 如果没有候选高度（例如 n=0），min_total_cost会是-1。按题意应为0。
    // 但题目保证 n > 0，且 n-m >= 0。如果 n>0, m<n，候选集必不为空。
    // 如果 n=m，我们在函数开头已经处理。
    printf("%lld\n", min_total_cost);
}

int main() {
    // 设置 freopen 以符合文件输入输出要求
    freopen("tower.in", "r", stdin);
    freopen("tower.out", "w", stdout);

    // 处理多组测试数据
    int T = read();
    while (T--) {
        solve();
    }
    
    // 关闭文件句柄
    fclose(stdin);
    fclose(stdout);
    
    return 0;
}
